home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / dl_serie / updates / 078 / arj_996 / mode_1_3.s < prev    next >
Text File  |  1995-11-25  |  15KB  |  589 lines

  1. ;
  2. ; ARJ Mode 1-3 and Mode 5-8 decode functions
  3. ; Size optimized
  4. ; (c) 1993 Mr Ni! (the Great) of the TOS-crew
  5. ;
  6. ; This function uses a BIG amount of stack space!
  7. ; It uses about 16kB!
  8. ; You can reduce this amount with 13320 bytes
  9. ; by suppyling A3 with a pointer to a 13320 bytes big
  10. ; workspace and removing the stack allocation and
  11. ; deallocation code at the right places in the source
  12. ; text. (total is 3 lines, 2 at the start, 1 at main rts)
  13. ;
  14. ;void decode(ulong origsize /* size of depacked data */, 
  15. ;            char* depack_space, char* packed_data)
  16. ;
  17. ; CALL:
  18. ; D0 = Origsize (size of the depacked data)
  19. ; A0 = ptr to depack space
  20. ; A1 = ptr to packed data
  21. ;
  22. ; RETURN
  23. ; depacked data in depack space
  24. ;
  25.  
  26. workspacesize   EQU 13320
  27. pointer         EQU 0
  28. rbuf_current    EQU 4
  29. c_table         EQU 8
  30. c_len           EQU 8200
  31. avail           EQU 8710
  32. left            EQU 8712
  33. right           EQU 10750
  34. pt_len          EQU 12788
  35. pt_table        EQU 12808
  36.  
  37.  
  38. ; register usage:
  39. ; D0 =
  40. ; D1 =
  41. ; D2 = temporary usage
  42. ; D3 = byte count
  43. ; D4 = command tri-nibble
  44. ; D5 = const:  #$100
  45. ; D6 = bitbuf, subbitbuf
  46. ; D7 = .H: command count, .B: bits in subbitbuf
  47. ;
  48. ; A0 = klad
  49. ; A1 = rbuf_current
  50. ; A2 = c_table
  51. ; A3 = workspace_ptr
  52. ; A4 = text_pointer
  53. ; A5 = c_len
  54. ; A6 = copy_pointer
  55. ; A7 = Stack pointer
  56. decode:
  57.      movem.l D3-D7/A2-A6,-(SP) ;
  58.      lea     -workspacesize(SP),SP ; or supply your own workspace here
  59.      lea     (SP),A3         ; remove if alternative workspace supplied
  60.      movea.l A0,A4           ; depack space
  61.      move.l  D0,D3           ; origsize
  62.      moveq   #0,D7           ; bitcount = 0
  63.      move.w  A1,D0           ; for checking rbuf_current
  64.      btst    D7,D0           ; does readbuf_current point to an even address?
  65.      beq.s   .cont           ; yes
  66.      move.b  (A1)+,D6        ; pop eight  bits
  67.      moveq   #8,D7           ; 8 bits in subbitbuf
  68.      lsl.w   #8,D6
  69. .cont:
  70.      moveq   #$10,D4         ; push 16 (8) bits into bitbuf
  71.      sub.w   D7,D4           ; subtract still available bits from  d5
  72.      lsl.l   D7,D6
  73.      move.w  (A1)+,D6        ; word in subbitbuf
  74.      lsl.l   D4,D6           ; fill bitbuf
  75.      swap    D6
  76.      lea     c_len-pointer(A3),A5 ;
  77.      lea     c_table-c_len(A5),A2
  78.      lea     pt_table-c_len(A5),A0 ;
  79. .count_loop:
  80.      move.w  D6,D2           ; bitbuf in d2
  81.      swap    D7              ; size of Hufmann-block
  82.      dbra    D7,.bnz_cont    ; Hufmann block size > 0?
  83.  
  84. .blocksize_zero:             ; load a new Hufmann table
  85.      movem.l D3/A0/A2/A4,-(SP)
  86.      move.w  D2,D7           ; blocksize
  87.      subq.w  #1,D7           ; adapt blocksize for dbra
  88.      swap    D7              ; bitcount to LSW
  89.      moveq   #$10,D0         ; pop 16 bits
  90.      bsr     fillbits
  91.      moveq   #$03,D2         ; call-values for read_pt_len()
  92.      moveq   #$05,D1         ;
  93.      moveq   #$13,D0         ;
  94.      bsr     read_pt_len     ; call read_pt_len
  95.      movea.l rbuf_current-c_len(A5),A1
  96. ;void read_c_len(void)       ;
  97.      bsr.s   .get_them2
  98.      move.w  D2,D0
  99.      bne.s   .n_niet_nul     ;
  100.      bsr.s   .get_them2
  101.      lea     (A5),A0         ;
  102.      moveq   #$7F,D1         ;
  103. .loop_1:
  104.      clr.l   (A0)+           ; clear table
  105.      dbra    D1,.loop_1
  106.      lea     c_table-pointer(A3),A0
  107.      move.w  #$0FFF,D1
  108. .loop_2:
  109.      move.w  D2,(A0)+
  110.      dbra    D1,.loop_2
  111.      bra     .einde
  112.  
  113. .get_them2:
  114.      moveq   #9,D0           ;
  115.      move.w  D6,D2           ; bitbuf
  116.      lsr.w   #7,D2           ; shift 'old' bits
  117.      bra     fillbits
  118.  
  119. .n_niet_nul:                 ; *******************************
  120. ;
  121. ; Register usage:
  122. ;
  123. ; d0
  124. ; d1
  125. ; d2
  126. ; d3
  127. ; d4
  128. ; d5 = $13
  129. ; d6 = .l (sub) bitbuf
  130. ; d7 = .b bits in bitbuf
  131. ;
  132. ; a0 = temporary usage
  133. ; a1 = rbuf_current
  134. ; a2 = right
  135. ; a3 = rbuf_tail
  136. ; a4 = pt_table
  137. ; a5 = c_len
  138. ; a6 = left
  139. ; a7 = sp
  140. ;
  141.      lea     pt_table-c_len(A5),A4 ; pt_table
  142.      lea     right-c_len(A5),A2 ; right
  143.      lea     left-c_len(A5),A6 ; left
  144.      move.w  D0,D3           ; count
  145.      moveq   #0,D4           ;
  146.      moveq   #$13,D5         ;
  147.      moveq   #0,D0           ;
  148. .loop_3:
  149.      move.w  D6,D0           ; sub bitbuf
  150.      lsr.w   #8,D0           ; upper 8 bits
  151.      add.w   D0,D0           ;
  152.      move.w  0(A4,D0.w),D2   ; check pt_table
  153.      bge.s   .c_kleiner_NT   ;
  154.      neg.w   D2
  155.      moveq   #7,D0           ;
  156.      move.w  D6,D1           ; bitbuf
  157. .loop_4:                     ;
  158.      add.w   D2,D2           ;
  159.      btst    D0,D1           ;
  160.      beq.s   .links          ;
  161.      move.w  0(A2,D2.w),D2   ;
  162.      cmp.w   D5,D2           ;
  163.      dbcs    D0,.loop_4      ;
  164.      bra.s   .c_kleiner_NT   ;
  165. .links:                      ;
  166.      move.w  0(A6,D2.w),D2   ;
  167.      cmp.w   D5,D2           ;
  168.      dbcs    D0,.loop_4      ;
  169.  
  170. .c_kleiner_NT:               ;
  171.      move.b  pt_len-pt_table(A4,D2.w),D0 ;
  172.      bsr     fillbits
  173.      cmp.w   #2,D2           ;
  174.      bgt.s   .c_groter_2     ;
  175.      beq.s   .c_niet_1       ;
  176.      tst.w   D2              ;
  177.      beq.s   .loop_5_init    ;
  178.      moveq   #4,D0
  179.      bsr     getbits
  180.      addq.w  #2,D2           ;
  181.      bra.s   .loop_5_init    ;
  182. .c_niet_1:
  183.      bsr.s   .get_them2
  184.      add.w   D5,D2           ;
  185. .loop_5_init:
  186.      moveq   #0,D0           ;
  187.      lea     0(A5,D4.w),A0   ;
  188.      add.w   D2,D4           ;
  189. .loop_5:
  190.      move.b  D0,(A0)+        ;
  191.      dbra    D2,.loop_5      ;
  192.      bra.s   .loop_3_test    ;
  193. .c_groter_2:
  194.      moveq   #0,D0           ;
  195.      subq.w  #2,D2           ;
  196.      move.b  D2,0(A5,D4.w)   ;
  197. .loop_3_test:
  198.      addq.w  #1,D4           ;
  199.      cmp.w   D4,D3           ;
  200.      bgt.s   .loop_3         ;
  201.      move.w  #$01FE,D1       ;
  202.      sub.w   D4,D1           ;
  203.      lea     0(A5,D4.w),A0   ;
  204.      bra.s   .loop_6_test    ;
  205. .loop_6:
  206.      move.b  D0,(A0)+        ;
  207. .loop_6_test:
  208.      dbra    D1,.loop_6      ;
  209.      move.l  A1,rbuf_current-c_len(A5)
  210.      lea     c_table-c_len(A5),A1 ;
  211.      moveq   #$0C,D1         ;
  212.      movea.l A5,A0           ;
  213.      move.w  #$01FE,D0       ;
  214.      bsr     make_table      ;
  215.      movea.l rbuf_current-c_len(A5),A1
  216. .einde:
  217.      moveq   #-1,D2          ;
  218.      moveq   #$05,D1         ;
  219.      moveq   #$11,D0         ;
  220.      bsr     read_pt_len     ;
  221.      movea.l rbuf_current-c_len(A5),A1
  222.      movem.l (SP)+,D3/A0/A2/A4
  223.      move.w  #$0100,D5       ; constant
  224.      swap    D7              ; blocksize to LSW
  225.      move.w  D6,D2
  226.  
  227. ;***********************
  228. ;
  229. ; Register usage:
  230. ;
  231. ; d0 = temporary usage
  232. ; d1 = temporary usage
  233. ; d2 = temporary usage
  234. ; d3 = loopcount
  235. ; d4 = command byte
  236. ; d5 = const: $100
  237. ; d6 = (sub)bitbuf
  238. ; d7 = .h: command count, .b byte count
  239. ;
  240. ; a0 = pt_table
  241. ; a1 = rbuf_current
  242. ; a2 = c_table
  243. ; a3 = rbuf_tail
  244. ; a4 = text
  245. ; a5 = c_len
  246. ; a6 = source pointer
  247. ; a7 = (sp)
  248.  
  249. .bnz_cont:
  250.      swap    D7              ; bitcount in LSW d7
  251.      lsr.w   #4,D2           ; charactertable is 4096 bytes (=12 bits)
  252.      add.w   D2,D2
  253.      move.w  0(A2,D2.w),D2   ; pop character
  254.      bmi.s   .j_grotergelijk_nc
  255. .decode_c_cont:              ;
  256.      move.b  0(A5,D2.w),D0   ; pop 'charactersize' bits from buffer
  257.      bsr     fillbits
  258.      sub.w   D5,D2           ;
  259.      bcc.s   .sliding_dic    ;
  260.      move.b  D2,(A4)+        ; push character into buffer
  261.      subq.l  #1,D3
  262.      bne     .count_loop
  263. .decode_einde:
  264.      lea     workspacesize(SP),SP; remove if alternative workspace supplied
  265.      movem.l (SP)+,D3-D7/A2-A6 ;
  266.      rts                     ;
  267.  
  268. .j_grotergelijk_nc:
  269.      moveq   #$03,D1         ;
  270.      move.w  #$01FE,D0
  271.      bsr.s   .fidel_no
  272.      bra.s   .decode_c_cont  ;
  273.  
  274. .p_j_grotergelijk_np:
  275.      moveq   #$07,D1         ;
  276.      moveq   #$11,D0
  277.      bsr.s   .fidel_no
  278.      bra.s   .p_cont         ;
  279.  
  280. .fidel_no:
  281.      neg.w   D2
  282.      lea     left-c_len(A5),A0 ;
  283.      lea     right-left(A0),A6 ;
  284. .mask_loop:
  285.      add.w   D2,D2           ;
  286.      btst    D1,D6           ;
  287.      bne.s   .bitbuf_en_mask ;
  288.      move.w  0(A0,D2.w),D2   ;
  289.      cmp.w   D0,D2           ;
  290.      dbcs    D1,.mask_loop   ;
  291.      lea     pt_table-c_len(A5),A0 ;
  292.      rts
  293. .bitbuf_en_mask:
  294.      move.w  0(A6,D2.w),D2   ;
  295.      cmp.w   D0,D2           ;
  296.      dbcs    D1,.mask_loop   ;
  297.      lea     pt_table-c_len(A5),A0 ;
  298.      rts
  299.  
  300. .sliding_dic:
  301.      move.w  D2,D4
  302.      addq.w  #2,D4           ;
  303.      move.w  D6,D2           ;
  304.      lsr.w   #8,D2           ;
  305.      add.w   D2,D2           ;
  306.      move.w  0(A0,D2.w),D2   ;
  307.      bmi.s   .p_j_grotergelijk_np ;
  308. .p_cont:
  309.      move.b  pt_len-pt_table(A0,D2.w),D0 ;
  310.      bsr.s   fillbits
  311.      move.w  D2,D0           ;
  312.      beq.s   .p_einde        ;
  313.      subq.w  #1,D0           ;
  314.      move.w  D6,D2           ; subbitbuf
  315.      swap    D2
  316.      move.w  #1,D2           ;
  317.      rol.l   D0,D2           ; shift 'old' bits
  318.      bsr.s   fillbits
  319. .p_einde:
  320.      neg.w   D2              ; pointer offset negatief
  321.      lea     -1(A4,D2.w),A6  ; pointer in dictionary
  322.      sub.l   D4,D3           ; sub 'bytes to copy' from 'bytes to do' (d4 is 1 too less!)
  323. .copy_loop_0:
  324.      move.b  (A6)+,(A4)+     ;
  325.      dbra    D4,.copy_loop_0
  326.      subq.l  #1,D3
  327.      bne     .count_loop
  328.      bra     .decode_einde
  329.  
  330. ;d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,a7,sp
  331. ********************************************************************************
  332.  
  333. getbits:
  334.      move.l  D6,D2
  335.      swap    D2
  336.      clr.w   D2
  337.      rol.l   D0,D2
  338. fillbits:
  339.      sub.b   D0,D7
  340.      bcs.s   .fill_subbitbuf
  341.      rol.l   D0,D6
  342.      rts
  343. .fill_subbitbuf:
  344.      move.b  D7,D1
  345.      add.b   D0,D1
  346.      sub.b   D1,D0
  347.      rol.l   D1,D6
  348.      swap    D6
  349.      move.w  (A1)+,D6
  350.      swap    D6
  351.      rol.l   D0,D6
  352.      add.b   #16,D7
  353.      rts
  354.  
  355. ;d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,a7,sp
  356. *******************************************************************************
  357.  
  358. read_pt_len:
  359.      move.w  D0,D5
  360.      move.w  D1,D3
  361.      move.w  D2,-(SP)
  362.      move.w  D1,D0
  363.      bsr.s   getbits
  364.      lea     pt_len-c_len(A5),A0
  365.      lea     pt_table-pt_len(A0),A2
  366.      move.w  D2,D4
  367.      bne.s   .n_niet_nula
  368.      move.w  D3,D0
  369.      bsr.s   getbits
  370.      subq.w  #1,D5
  371. ._11:
  372.      clr.b   (A0)+
  373.      dbra    D5,._11
  374.      moveq   #$7F,D0
  375. .loop_2a:
  376.      move.w  D2,(A2)+
  377.      move.w  D2,(A2)+
  378.      dbra    D0,.loop_2a
  379.      addq.l  #2,SP
  380.      move.l  A1,rbuf_current-c_len(A5)
  381.      rts
  382. .n_niet_nula:
  383.      clr.w   D3
  384. .loop_3a:
  385.      move.l  D6,D2
  386.      swap    D2
  387.      clr.w   D2
  388.      rol.l   #3,D2
  389.      cmp.w   #7,D2
  390.      bne.s   .c_niet_7
  391.      moveq   #12,D0
  392.      bra.s   .loop_4a_test
  393. .loop_4a:
  394.      addq.w  #1,D2
  395. .loop_4a_test:
  396.      btst    D0,D6
  397.      dbeq    D0,.loop_4a
  398. .c_niet_7:
  399.      moveq   #3,D0
  400.      cmp.w   #7,D2
  401.      bcs.s   .endif
  402.      moveq   #-3,D0
  403.      add.w   D2,D0
  404. .endif:
  405.      move.b  D2,0(A0,D3.w)
  406.      bsr.s   fillbits
  407.      addq.w  #1,D3
  408.      cmp.w   (SP),D3
  409.      bne.s   .loop_3a_test
  410.      moveq   #2,D0
  411.      bsr     getbits
  412.      moveq   #0,D0
  413.      lea     0(A0,D3.w),A6
  414.      add.w   D2,D3
  415.      bra.s   .loop_5a_test
  416. .loop_5a:
  417.      move.b  D0,(A6)+
  418. .loop_5a_test:
  419.      dbra    D2,.loop_5a
  420. .loop_3a_test:
  421.      cmp.w   D3,D4
  422.      bgt.s   .loop_3a
  423.      moveq   #0,D0
  424.      lea     0(A0,D3.w),A6
  425.      bra.s   .loop_6a_test
  426. .loop_6a:
  427.      move.b  D0,(A6)+
  428.      addq.w  #1,D3
  429. .loop_6a_test:
  430.      cmp.w   D3,D5
  431.      bgt.s   .loop_6a
  432.      move.w  D5,D0
  433.      move.l  A1,rbuf_current-c_len(A5)
  434.      movea.l A2,A1
  435.      moveq   #8,D1
  436.      addq.l  #2,SP
  437. make_table:
  438.      movem.l D6-D7/A3/A5,-(SP)
  439.      lea     -$6C(SP),SP
  440.      movea.w D0,A6
  441.      movea.l A0,A2
  442.      move.w  D1,D4
  443.      add.w   D4,D4
  444.      move.w  D1,D3
  445.      movea.l A1,A4
  446.      lea     $48(SP),A1
  447.      movea.l A1,A0
  448.      moveq   #7,D0
  449. .j_loop_0:
  450.      clr.l   (A0)+
  451.      dbra    D0,.j_loop_0
  452.      movea.l A2,A0
  453.      move.w  A6,D0
  454.      subq.w  #1,D0
  455. .loop_0:
  456.      clr.w   D1
  457.      move.b  (A0)+,D1
  458.      add.w   D1,D1
  459.      addq.w  #1,-2(A1,D1.w)
  460.      dbra    D0,.loop_0
  461.      lea     2(SP),A0
  462.      moveq   #0,D1
  463.      move.w  D1,(A0)+
  464.      moveq   #15,D2
  465. .j_loop_1:
  466.      move.w  (A1)+,D0
  467.      lsl.w   D2,D0
  468.      add.w   D0,D1
  469.      move.w  D1,(A0)+
  470.      dbra    D2,.j_loop_1
  471.      moveq   #$10,D0
  472.      sub.w   D3,D0
  473.      lea     2(SP),A1
  474.      lea     $26(SP),A0
  475.      moveq   #1,D1
  476.      moveq   #-1,D2
  477.      add.b   D3,D2
  478.      lsl.w   D2,D1
  479. .loop_1a:
  480.      move.w  (A1),D2
  481.      lsr.w   D0,D2
  482.      move.w  D2,(A1)+
  483.      move.w  D1,(A0)+
  484.      lsr.w   #1,D1
  485.      bne.s   .loop_1a
  486.      moveq   #1,D1
  487.      moveq   #-1,D2
  488.      add.w   D0,D2
  489.      lsl.w   D2,D1
  490. .loop_2b:
  491.      move.w  D1,(A0)+
  492.      lsr.w   #1,D1
  493.      bne.s   .loop_2b
  494.      move.w  2(SP,D4.w),D2
  495.      lsr.w   D0,D2
  496.      beq.s   .endif0
  497.      moveq   #1,D5
  498.      lsl.w   D3,D5
  499.      sub.w   D2,D5
  500.      subq.w  #1,D5
  501.      add.w   D2,D2
  502.      lea     0(A4,D2.w),A0
  503. .loop_3b:
  504.      move.w  D1,(A0)+
  505.      dbra    D5,.loop_3b
  506. .endif0:
  507.      moveq   #1,D1
  508.      moveq   #-1,D2
  509.      add.b   D0,D2
  510.      lsl.w   D2,D1
  511.      lea     avail-c_len(A5),A1
  512.      lea     right-avail(A1),A3
  513.      lea     $6A(SP),A5
  514.      move.w  A6,(A1)
  515.      moveq   #0,D5
  516. .loop_4b:
  517.      clr.w   D3
  518.      move.b  0(A2,D5.w),D3
  519.      beq.s   .loop_4b_inc_0
  520.      add.w   D3,D3
  521.      lea     0(SP,D3.w),A0
  522.      move.w  (A0),D2
  523.      move.w  D2,D6
  524.      add.w   $24(A0),D6
  525.      move.w  D6,(A0)
  526.      cmp.w   D3,D4
  527.      blt.s   .len_groter_tablebits_j
  528.      sub.w   D2,D6
  529.      add.w   D2,D2
  530.      lea     0(A4,D2.w),A0
  531.      subq.w  #1,D6
  532. .j_loop_2:
  533.      move.w  D5,(A0)+
  534.      dbra    D6,.j_loop_2
  535. .loop_4b_inc_0:
  536.      addq.w  #1,D5
  537.      cmp.w   A6,D5
  538.      blt.s   .loop_4b
  539.      bra.s   .loop_4b_end
  540. .len_groter_tablebits_j:
  541.      move.w  D2,D7
  542.      lsr.w   D0,D7
  543.      add.w   D7,D7
  544.      lea     0(A4,D7.w),A0
  545.      move.l  A0,pointer-avail(A1)
  546.      neg.w   (A0)
  547.      move.w  D3,D6
  548.      sub.w   D4,D6
  549.      beq.s   .loop_6b_end
  550.      move.w  D6,(A5)
  551. .loop_6b:
  552.      move.w  (A0),D7
  553.      add.w   D7,D7
  554.      bne.s   .p_is_niet_nul
  555.      move.w  (A1),D6
  556.      move.w  D6,(A0)
  557.      add.w   D6,D6
  558.      move.w  D7,2(A1,D6.w)
  559.      move.w  D7,0(A3,D6.w)
  560.      addq.w  #1,(A1)
  561.      move.w  D6,D7
  562. .p_is_niet_nul:
  563.      lea     2(A1,D7.w),A0
  564.      move.w  D2,D6
  565.      and.w   D1,D6
  566.      beq.s   .left
  567.      lea     right-left(A0),A0
  568. .left:
  569.      add.w   D2,D2
  570.      subq.w  #2,(A5)
  571.      bhi.s   .loop_6b
  572. .loop_6b_end:
  573.      move.w  D5,(A0)
  574.      movea.l pointer-avail(A1),A0
  575.      neg.w   (A0)
  576. .loop_4b_inc:
  577.      addq.w  #1,D5
  578.      cmp.w   A6,D5
  579.      blt     .loop_4b
  580. .loop_4b_end:
  581.      lea     $6C(SP),SP
  582.      movem.l (SP)+,D6-D7/A3/A5
  583.      rts
  584.  
  585. ;d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,a7,sp
  586. ********************************************************************************
  587.  
  588.      END
  589.